const router = require('koa-router')(),
    fs = require('fs'),
    helper = require('../utils/helper'),
    sha1 = require('sha1'),
    msql = require('../lib/sql');



// 路由守卫

router.use(async (ctx, next) => {
    // 主要进行验证判断， 如果登录才可以访问  即使用await next()进行放开
    if (!ctx.session.login) {
        // 重定向到登录界面
        ctx.redirect('/login')
        console.log('登录不成功');
        return false;
    } else {
        await next();
        console.log('已经登录--前置路由守卫');

    }
})


// 根路径  如果上层router.use('/')不用加斜杠
let root = __dirname.slice(0, -8);
console.log(root);

router.get('/', ctx => {
    ctx.render('admin')
})
// 模板数据的处理

router.get('/handler', ctx => {
    let obj = { name: "语法", age: 25 };
    let arr = ['apple', 'banana', 'orange', 'pine'];
    let arrObj = [{ name: "1", age: 24 }, { name: '2', age: 23 }];
    let a = 4;
    let b = 'bad';
    let html = '<h2>输出的h2</h2>';
    let head = '头部';
    ctx.render('handlerdata', { head, arrObj, title: "输出", html, obj, a, b, arr })
})

router.get('/add', ctx => {
    ctx.render('add');
})

// 接受数据修改操作
router.post('/edit-do', async ctx => {
    // 接受post传值从前端传入后端
    let { title, password, city, sex, mydate, isShow, like, content, id } = ctx.request.body;

    let posterFileName = "";
    // 接受封面
    let field_icon = "";
    let poster = ctx.request.files.poster;
    // 上传封面
    if (poster) {
        posterFileName = helper.upload(poster);
        field_icon = `,icon=${posterFileName}`
    }


    // 接受轮播 只有一个时，不是数组就是一个文件对象
    let tmpArr = [];
    let swiper = ctx.request.files.swiper;

    if (swiper) {
        // 判断是一个还是多个文件
        if (swiper instanceof Array) {
            // 多文件
            for (let i = 0; i < swiper.length; i++) {
                tmpArr.push(helper.upload(swiper[i]));

            }
        } else {
            // 单文件
            tmpArr.push(helper.upload(swiper))
        }

    }

    // 处理数据
    // 密码加密(md5可逆,sha1哈希加密) 进行截取
    let field_pwd = "";
    if (password) {
        password = sha1(password).slice(3, 30);
        //  根据密码是否存在更新数据库中的密码字段
        field_pwd = `,pwd=${password}`;
    }
    // 356a192b7913b04c54574d18c28d46e6395428ab


    // 性别
    let sex_ = 0;
    if (sex == '男') {
        sex_ = 1;
    }

    // 爱好
    like = JSON.parse(like);
    let likeString = like.join(",");

    // 相册
    // 一次插入多条数据
    let mid = id;
    if (mid && tmpArr.length > 0) {
        // 拼接多个插入的数据
        let values = '';
        for (let i = 0; i < tmpArr.length; i++) {
            values += `(${mid},'${tmpArr[i]}'),`
        }
        // 去掉末尾的逗号

        values = values.slice(0, -1);
        let sql2 = `INSERT INTO photos(mid,path) VALUES ${values}`
        let res2 = await msql.query(sql2);

    }

    // 更新表 更新哪一条数据 id
    let sql = `UPDATE member SET username="${title}" ${field_pwd},hobby="${likeString}",province=${city},ismarried=${isShow},sex=${sex_},birthday='${mydate}',descript='${content}' ${field_icon} WHERE id=${id}`
    let res = await msql.query(sql);

    if (res.affectedRows > 0) {
        ctx.body = 'success'
    } else {
        ctx.body = 'fail'
    }

})


// 接受表单数据
router.post('/add-do', async ctx => {
    // 接受post传值从前端传入后端
    let { title, password, city, sex, mydate, isShow, like, content } = ctx.request.body;

    let posterFileName;
    // 接受封面
    let poster = ctx.request.files.poster;
    // 上传封面
    if (poster) {
        posterFileName = helper.upload(poster);

    }


    // 接受轮播 只有一个时，不是数组就是一个文件对象
    let tmpArr = [];
    let swiper = ctx.request.files.swiper;

    if (swiper) {
        // 判断是一个还是多个文件
        if (swiper instanceof Array) {
            // 多文件
            for (let i = 0; i < swiper.length; i++) {
                tmpArr.push(helper.upload(swiper[i]));

            }
        } else {
            // 单文件
            tmpArr.push(helper.upload(swiper))
        }

    }


    // 处理数据
    // 密码加密(md5可逆,sha1哈希加密) 进行截取
    password = sha1(password).slice(3, 30)
    // 356a192b7913b04c54574d18c28d46e6395428ab
    console.log(password);

    // 性别
    let sex_ = 0;
    if (sex == '男') {
        sex_ = 1;
    }

    // 爱好
    like = JSON.parse(like);
    let likeString = like.join(",");

    // 时间戳
    let date = new Date();
    let dt = parseInt(date.getTime() / 1000);

    // 数据存储到数据库中title,password,city,sex,mydate,isShow,like,content
    let sql = `INSERT INTO member(username,pwd,province,hobby,ismarried,sex,birthday,icon,descript,dt) VALUES ('${title}','${password}',${city},'${like}',${isShow},${sex_},'${mydate}','${posterFileName}','${content}',${dt})`

    let res = await msql.query(sql);
    console.log(res);

    // 相册

    if (res.affectedRows > 0) {
        // 一次插入多条数据
        let mid = res.insertId;
        if (mid && tmpArr.length > 0) {
            // 拼接多个插入的数据
            let values = '';
            for (let i = 0; i < tmpArr.length; i++) {
                values += `(${mid},'${tmpArr[i]}'),`
            }
            // 去掉末尾的逗号

            values = values.slice(0, -1);
            let sql2 = `INSERT INTO photos(mid,path) VALUES ${values}`
            let res2 = await msql.query(sql2);
            console.log(res2);

        }
    }


    // 数据从后端返回给前端 响应前端
    if (res.affectedRows > 0) {
        ctx.body = 'success';
    } else {
        ctx.body = 'fail'
    }

})


//富文本编辑器的图片上传
router.post('/upload', ctx => {
    // 目标文件
    let dst = root + '/static/uploads'//

    // 接受附件
    let img = ctx.request.files.file;

    // 新建文件名
    let date = new Date();
    let dt = date.getTime();

    // 随机数
    let rand = parseInt(Math.random() * 1000)

    // 新文件名
    let newTitle = dt + rand + '';
    // console.log(newTitle);

    // 获取文件的扩展名
    let nameArr = img.name.split(".")
    let extension = nameArr[nameArr.length - 1];

    // 最终文件路径
    let lastFile = dst + '/' + newTitle + '.' + extension;

    // 上传到服务器
    // 创建可读流
    let readStream = fs.createReadStream(img.path);
    // 创建写入流
    let writeStream = fs.createWriteStream(lastFile);

    // 创建管道
    readStream.pipe(writeStream);

    // 返回结果给前端layedit  插入图片到富文本编辑器，并保存在uploads
    ctx.body = {
        "code": 0 //0表示成功，其它失败
        , "msg": "" //提示信息 //一般上传失败后返回
        , "data": {
            "src": "http://localhost:2022/uploads/" + newTitle + '.' + extension
            , "title": "" //可选
        }
    }



})

// 发布新闻
router.get("/newsAdd", ctx => {
    ctx.render("newsadd")
})
// 接受新闻数据
router.post('/newsAdd-do', ctx => {
    let { content, title, source } = ctx.request.body;
    console.log(content);
    console.log(title);
    console.log(source);
    // 获取模板数据
    let fileData = fs.readFileSync(root + '/templates/news.html', 'utf-8');
    // 替换占位符
    fileData = fileData.replace(/#title#/g, title);
    fileData = fileData.replace(/#source#/g, source);
    fileData = fileData.replace(/#desc#/g, content);

    // 创建目录  以日期作为文件夹
    let date = new Date();
    let dirName = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
    let dst = root + '/static/' + dirName;
    console.log(dst);
    // 创建目录前先判断目录是否存在
    if (!fs.existsSync(dst)) {
        fs.mkdirSync(dst);
    }
    // 创建文件
    // 定义文件名称
    let dstFileName = dst + '/' + date.getTime() + '.html';
    // 写入内容并创建文件
    try {
        fs.writeFileSync(dstFileName, fileData)
        ctx.body = 'success';
    } catch (err) {
        ctx.body = "fail";
        console.log(err);
    }
})

//检测用户名是否存在  
router.get("/checkusername", async ctx => {
    let { username } = ctx.query;
    if (username) {
        // 通过前端的失去焦点事件 发送ajax请求 去查询数据库中的数据，如果有返回exist 
        let sql = `SELECT id FROM member WHERE username='${username}' LIMIT 1`
        let res = await msql.query(sql);
        if (res.length > 0) {
            ctx.body = 'exist';
        } else {
            ctx.body = "no";
        }
    }
})

// 列表
router.get('/list', async ctx => {
    // 接受页码和搜索词
    let { page, keywords, sex } = ctx.query;
    keywords = keywords || '';
    page = page || 1;
    // 每页显示的记录数
    let pageSize = 2;
    // 开始读取的位置
    let start = (page - 1) * pageSize;
    // 搜索的条件
    let where_ = '';
    // 搜索
    if (keywords) {
        where_ += `AND username LIKE "%${keywords}%"`;
    }
    // 性别 多个条件
    if (sex) {
        where_ += `AND sex=${sex}`
    }
    // 获取总记录数   
    let sql_ = `SELECT count(*) as total FROM member WHERE 1 $(where_)`;
    let res_ = await msql.query(sql_);
    let totalRecords = res_[0].total;
    // 总页码数
    let totalPages = Math.ceil(totalRecords / pageSize);
    // 获取会员数据
    let sql = `SELECT id,username,hobby,icon,dt FROM member WHERE 1 $(where_) ORDER BY id DESC LIMIT ${start},${pageSize}`;
    let res = await msql.query(sql);
    // 处理数据 map是每项进行处理
    res = res.map((item, index) => {
        // 补全附件地址http://localhost:2022/uploads/xxxxx.jpg
        item.icon = host + '/uploads' + item.icon;
        // 格式化日期
        let date = new Date(item.dt * 1000);
        item.dt = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
        return item;
    })

    ctx.render('list', {
        res,
        totalRecords,
        pageSize,
        page,
        keywords
    })

})
// 浏览
router.get('/detail', async ctx => {
    // 获取前端传入的id
    let { id } = ctx.query;
    // 根据id获取标中的数据
    if (id) {
        // 主记录
        // 一对一适合做联表查询，一对多不适合做联表查询
        let sql = `SELECT id,username,province,hobby,ismarried,sex,date_format(birthday,"%Y-%m-%d") as birthday,icon,descript,dt FROM member WHERE id=${id}`
        let res = await msql.query(sql);

        // 读取相册
        let sql_ = `SELECT path FROM photos WHERE mid=${id}`;
        let res_ = await msql.query(sql_);

        // 结果
        let data = res[0];

        // 添加photos到结果中
        data.photos = res_;

        // 处理数据
        // 籍贯
        let province = '';
        switch (province) {
            case 1:
                province = "北京";
                break;
            case 2:
                province = "上海";
                break;
            default:
                province = "苏州";
                break;
        }
        data.province = province;
        // 已婚
        data.ismarried = data.ismarried ? '已婚' : "未婚";

        // 性别
        data.sex = data.sex ? '男' : '女';

        // 头像的地址
        data.icon = host + '/uploads/' + data.icon;

        // 相册地址
        data.photos = data.photos.map(item => {
            item.path = host + '/uploads/' + item.path;
            return item;
        })

        // 注册日期
        let date = new Date(date.dt * 1000);
        data.dt = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();

        // 数据渲染到模板上
        ctx.render('view', { ...data })
    }
})
// 修改
router.get('/edit', ctx => {
    let { id } = ctx.query;
    let sql = `SELECT id,username,hobby,ismarried,sex,province,date_format(birthday,%Y-%m-%d) as birthday,descript FROM member WHERE id=${id} LIMIT 1`;
    let res = await msql.query(sql);
    let data = res[0];
    // 爱好进行处理
    data.write = data.hobby.includes('写作') ? "checked" : "";
    data.reading = data.hobby.includes('阅读') ? "checked" : "";
    data.daidai = data.hobby.includes('呆呆') ? "checked" : "";
    // 已婚
    data.ismarried = data.ismarried ? "checked" : "";
    // 性别
    data.man = data.sex ? "checked" : "";
    data.lady = data.sex ? "" : "checked";
    // 

    ctx.render('edit', data);
})

// 删除
router.get('/del',async ctx=>{
    let {id} = ctx.query;
    if(id){
        // 删除相册
        let sql = `DELETE FROM photos WHERE mid=${id}`;
        let res = await msql.query(sql);
        // 删除主体
        let sql_ = `DELETE FROM member WHERE mid=${id}`;
        let res_ = await msql.query(sql_);

        // 结果
        if(res_.affectedRows>0){
            ctx.body="success"
        }else{
            ctx.body="fail"
        }
    }
})

module.exports = router.routes()